package com.tedu.api.date.io;

import org.junit.Test;

import java.io.*;
import java.nio.charset.StandardCharsets;

/**
 * 标准IO流---目的:数据传输 输出文本,图片
 * java定义一套标准流-->数据传输-->创建流:直接创建某个流对象
 * 标准流规则①:方向划分---输入流和输出流
 *             输入流:读入-->文件-->相对于程序-->文件往程序走
 *             InputStream(抽象类:定义所有读的写法)[学习:子实现类]
 *             输出流:写出-->文件-->相对于程序-->程序写出
 *           ②:功能划分
 *           低级流[节点流]:是建立在程序与数据源之间的"管道"
 *            功能:负责搬运的数据流,输入流于输出流
 *            特点:一个字节一个字节读或者写的
 */
public class IOAPI {
    /**
     * 输入流  低级流
     * 标准流   方向 :   功能:   文件输入流:FileOutStream
     * 输出流      高级流
     * 需求:写出一个文件fos.txt
     * <p>
     * FileOutputStream 构造器使用
     * new FileOutputStream("路径+文件全称")
     * new FileOutputStream("路径+文件全称",Boolean appeand)
     * 写出文件的同时实现追加效果,第二个参数:true 追加
     * false 默认不追加
     */
    @Test
    public void testFOS() throws FileNotFoundException {
        /*RandomAccessFile raf=
                new RandomAccessFile("fs.txt","rw");*/
        //低级流---文件输出流对象--从程序写出"文件:数据"
        File file =
                new File("fos.txt", "rw");
        FileOutputStream fos = new FileOutputStream("fos.txt");
        //需求:fos.txt增加一行文本
        String say = "独一无二";
        //字符串由字符数组构成
        //输出流---


    }

    /**
     * 文件输入流:读入操作
     * FileInputStream 文件输入流
     * read() 返回读取的一个字节--效率低
     * read(字节数组byte[]b)
     * 返回一个"指定字节数组:空间大小"的读取---效率高
     * 需求:读入fos.txt文件内容
     */
    @Test
    public void testFIS() throws IOException {
        //创建文件输入流---读入:fos.txt
        FileInputStream fis = new FileInputStream("fos.txt");
        //读入效率高:创建字节数组10KB-指定空间为:10KB
        byte[] data = new byte[1024 * 10];
        //读入操作:read(字节数组)| 以10KB 读入数据
        int len = fis.read(data);
        //写出:文本---字符串
        System.out.println(len);
        String str = null;
        System.out.println("打印Fos.txt文件:" + null);

    }
    @Test
    public void testBOS() throws IOException {
//1.创建低级流 -- >bos.txt
        FileOutputStream fos = new FileOutputStream("bos.txt");

        //2.创建高级流 -- >缓冲区:字节数组 -- 合理【传输效率】
        BufferedOutputStream bos = new BufferedOutputStream(fos);
//3.写出文本内容
        String str = "50 块钱设计在好看,也不入100块钱找人稀罕 ~~~ ";

//4.写出到 bos.txt 文件中:字符串转成字节数组 -- 写出
        bos.write(str.getBytes());
        //5.将缓冲区数据一次性写出 flush()【立即写出】
// bos.flush();
        //A  B 你好  你认识我吗   干哈呢  ??
        bos.close();//关闭流-1-一定把缓冲区数据全部写出
    }
    /**
     * 标准IO---成对[低级流+高级流]结合异常---数据传输---成功[异常需要捕获]
     * 需求:重构 testBOS() 单元测试
     */
    public void testBOSIO() throws IOException {
        //1.置空流 --- 提升所有流作用域
        FileOutputStream fos=null;//低级流:搬运数据
        BufferedOutputStream bos=null;//高级流:缓冲输出流
        //2.捕获流异常并且做出处理
        try {
            fos=new FileOutputStream( "bos.txt") ;//低级流
            bos=new BufferedOutputStream(fos);//高级流:缓冲区:字节数组
            bos.write("独一无二".getBytes());
            bos.flush();
        } catch (FileNotFoundException e){//I0流“小”异常
            e.printStackTrace();
        } catch (IOException e){ //I0流“中”异常:小异常父类
            e.printStackTrace();
        } catch(Exception e){//"大”异常 Exception
            e.printStackTrace();
        } finally { //一定执行代码块
//3.关闭流 --- 高级流 -- 释放资源
//判断:高级流一定是不为null,关闭
            if(bos!= null)
                try {
                    bos. close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }
}
